package uiMain;

import gestorbienraizok.usuarios.Cliente;
import gestorbienraizok.usuarios.ClienteDemandador;
import gestorbienraizok.usuarios.ClienteOferente;
import gestorbienraizok.usuarios.Funcionario;
import static uiMain.bienRaizOk.*;
import gestorbienraizok.usuarios.Persona;

public class OpcionAsignarRolAUnCliente extends OpcionDeMenu {

    private String nombreParaMostrar = " Asignar rol a un cliente (oferente o demandante)";
    private long cedulaPasada = -100;//Se queda así en caso de no utilizar este método pasándole una cédula

    @Override
    public void ejecutar() {
        long cedula = cedulaPasada;

        if (this.cedulaPasada == -100) {
            do {
                System.out.print("Ingrese la cédula del cliente: ");
                cedula = entrada.nextLong();
            } while (cedula <= 0);
        }

        Persona estaPersona = Persona.buscarPersona(cedula);
        if (estaPersona != null) {
            if (estaPersona instanceof Cliente) {
                Cliente esteCliente = (Cliente) estaPersona;
                if (esteCliente.tieneContratos() || esteCliente.numeroDePropiedades() != 0) {
                    System.out.println("No se le puede cambiar el rol a este cliente porque tiene contratos o propiedades asociados");
                    return;
                } else {
                    System.out.println(esteCliente.getNombre() + " es actualmente un " + esteCliente.getTipoDeCliente());
                    byte respuesta;
                    switch (esteCliente.getTipoDeCliente()) {
                        case "oferente":
                            do {
                                System.out.print("Seleccione el nuevo rol: demandante (1), sin rol (2): ");
                                respuesta = entrada.nextByte();
                            } while (respuesta < 1 || respuesta > 2);

                            if (respuesta == 1) {
                                recopilarInformacionDeClienteDemandante(esteCliente);
                            } else {
                                Cliente nuevoCliente = new Cliente(esteCliente);
                                listaDePersonas.remove(esteCliente);
                                listaDePersonas.add(nuevoCliente);
                            }

                            break;
                        case "demandante":

                            do {
                                System.out.print("Seleccione el nuevo rol: oferente (1), sin rol (2): ");
                                respuesta = entrada.nextByte();
                            } while (respuesta < 1 || respuesta > 2);
                            Funcionario esteFuncionario = (Funcionario) usuarioActual;
                            esteFuncionario.quitarDeLaLista(esteCliente);
                            if (respuesta == 1) {
                                ClienteOferente nuevoCliente = new ClienteOferente(esteCliente);
                                listaDePersonas.remove(esteCliente);
                                listaDePersonas.add(nuevoCliente);
                            } else {
                                Cliente nuevoCliente = new Cliente(esteCliente);
                                listaDePersonas.remove(esteCliente);
                                listaDePersonas.add(nuevoCliente);
                            }
                            break;
                        case "un cliente sin rol":
                            do {
                                System.out.print("Seleccione el nuevo rol: oferente (1), demandante (2): ");
                                respuesta = entrada.nextByte();
                            } while (respuesta < 1 || respuesta > 2);
                            if (respuesta == 1) {
                                ClienteOferente nuevoCliente = new ClienteOferente(esteCliente);
                                listaDePersonas.remove(esteCliente);
                                listaDePersonas.add(nuevoCliente);
                            } else {
                                recopilarInformacionDeClienteDemandante(esteCliente);
                            }
                            break;
                    }
                }
            } else {
                System.out.println(estaPersona.getNombre() + " es un " + estaPersona.tipoDePersona() + ", no un cliente.");
                return;
            }
        } else {
            System.out.println("No se encontró a ninguna persona con cédula " + cedula + " en la base de datos");
        }
    }

    public void setCedulaPasada(long cedula) {
        this.cedulaPasada = cedula;
    }

    public void recopilarInformacionDeClienteDemandante(Cliente esteCliente) {

        System.out.print("Ingrese el presupuesto del cliente: $");
        long presupuesto = entrada.nextLong();
        while (presupuesto < 0) {
            System.out.print("Ingrese un presupuesto válido (positivo): $");
            presupuesto = entrada.nextLong();
        }
        System.out.print("Ingrese el lugar de preferencia del cliente: ");
        entrada.nextLine();
        String lugar = entrada.nextLine();

        System.out.print("Ingrese el estrato deseado por el cliente (1-6): ");
        byte estrato = entrada.nextByte();
        while (estrato < 1 || estrato > 6) {
            System.out.print("Ingrese un estrato válido (1-6): ");
            estrato = entrada.nextByte();
        }
        System.out.print("Ingrese otras preferencias del cliente: ");
        entrada.nextLine();
        String preferencias = entrada.nextLine();

        ClienteDemandador nuevoCliente = new ClienteDemandador(esteCliente, presupuesto, lugar, estrato, preferencias, (Funcionario) usuarioActual);
        listaDePersonas.remove(esteCliente);
        listaDePersonas.add(nuevoCliente);
        Funcionario esteFuncionario = (Funcionario) usuarioActual;
        esteFuncionario.anhadirALaLista(nuevoCliente);
    }

    @Override
    public String toString() {
        return nombreParaMostrar;
    }

    @Override
    public String toStringParaMostrarElNivel() {
        return nombreParaMostrar.trim().concat("...................................................................").substring(0, 67) + "Funcionarios";
    }

}
